<?php
/**
 * @link https://gitee.com/toshcn/micro-hau
 * @copyright Copyright (c) 2022/4/29 micro-hau
 * @author toshcn <toshcn@foxmail.com>
 */

namespace api\modules\v1\forms;

use Yii;
use common\models\User;
use common\models\BaseModel;

/**
 * User模型登录表单
 * Class UserForm
 * @package api\modules\v1\forms
 */
class UserLoginForm extends BaseModel
{
    public $mobile;                 // 用户账号手机号
    public $countryCode = 86;       // 用户账号手机号国家代码: 86(中国)
    public $password;               // 用户账号密码

    /** @var null|User  */
    private $_user = null;          // 用户对象

    /**
     * 表单字段规则
     * @return array
     */
    public function rules()
    {
        return [
            [['mobile', 'password'], 'trim'],
            [['countryCode'], 'number', 'skipOnError' => true],
            [['mobile', 'countryCode', 'password'], 'required'],
            ['mobile', 'validateMobile', 'skipOnError' => true],     // 行内验证器 检测手机号码
            ['password', 'validatePassword', 'skipOnError' => true], // 行内验证器 检测密码强度
        ];
    }

    /**
     * 检测手机号
     * @param string $attribute 当前检测的字段名
     * @param array $params 以名-值对形式提供的额外参数
     * @param \yii\validators\InlineValidator $validator 当前行内验证器 InlineValidator实例。此参数自版本 Yii 2.0.11 起可用。
     */
    public function validateMobile($attribute, $params, $validator)
    {
        if (!$this->hasErrors()) {
            if (!Yii::$app->utils->regExp($this->$attribute, 'cn_mobile')) {
                // 检测手机号码格式
                $validator->addError($this, $attribute, Yii::t('common', 'The mobile "{value}" is invalid.'));
            } else {
                // 检测手机号是否已注册
                $this->_user = User::findByMobile($this->mobile, $this->countryCode);
                if (empty($this->_user)) {
                    $validator->addError($this, $attribute, Yii::t('common', 'The account is not registered.'));
                }
            }
        }
    }

    /**
     * 检测密码
     * @param string $attribute 当前检测的字段名
     * @param array $params 以名-值对形式提供的额外参数
     * @param \yii\validators\InlineValidator $validator 当前行内验证器 InlineValidator实例。此参数自版本 2.0.11 起可用。
     */
    public function validatePassword($attribute, $params, $validator)
    {
        if (!$this->hasErrors()) {
            if (empty($this->_user) || !$this->_user->validatePassword($this->$attribute)) {
                $this->addError($attribute, Yii::t('common', 'Password verification failed.'));
            }
        }
    }

    /**
     * 返回用户对象
     * @return null|@common\models\User
     */
    public function getUser()
    {
        return $this->_user;
    }

    /**
     * 登录账号
     * @return bool
     */
    public function login()
    {
        // rules()规则都验证通过
        if ($this->validate()) {
            if (Yii::$app->getUser()->login($this->_user)) {
                return true;
            }
        }
        return false;
    }
}
